home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / db / Db_Open.c < prev    next >
C/C++ Source or Header  |  1989-06-16  |  3KB  |  95 lines

  1. /* 
  2.  * Db_Open.c --
  3.  *
  4.  *    Source code for the Db_Open procedure.
  5.  *
  6.  * Copyright 1988 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that the above copyright
  10.  * notice appear in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  */
  15.  
  16. #ifndef lint
  17. static char rcsid[] = "$Header: /sprite/src/lib/c/db/RCS/Db_Open.c,v 1.6 89/06/15 22:45:11 douglis Exp $ SPRITE (Berkeley)";
  18. #endif not lint
  19.  
  20.  
  21. #include <db.h>
  22. #include <errno.h>
  23. #include "dbInt.h"
  24.  
  25.  
  26. /*
  27.  *----------------------------------------------------------------------
  28.  *
  29.  * Db_Open --
  30.  *
  31.  *    Open a system data file and return a handle to it.
  32.  *
  33.  * Results:
  34.  *    The handle is returned in *handlePtr.
  35.  *    On error, -1 is returned, otherwise 0 is returned.
  36.  *
  37.  * Side effects:
  38.  *    The file is opened and (optionally) locked.
  39.  *
  40.  *----------------------------------------------------------------------
  41.  */
  42.  
  43. int
  44. Db_Open(file, size, handlePtr, writing, lockWhen, lockHow, numBuf)
  45.     char *file;
  46.     int size;
  47.     Db_Handle *handlePtr;
  48.     int writing;         /* 1 if opening for writing */
  49.     Db_LockWhen lockWhen;
  50.     Db_LockHow lockHow;
  51.     int numBuf;            /* number of records to buffer */
  52. {
  53.     int streamID;
  54.     
  55.     streamID = open(file, (writing ? O_RDWR : O_RDONLY) | O_CREAT, FILE_MODE);
  56.     if (streamID == -1) {
  57.     syslog(LOG_ERR, "Db_Open: error opening file %s: %s.\n", file,
  58.            strerror(errno));
  59.     return(-1);
  60.     }
  61.  
  62.     /*
  63.      * Don't allow buffering for files locked a record at a time.
  64.      */
  65.     if (numBuf > 0 &&
  66.     (lockWhen == DB_LOCK_ACCESS || lockWhen == DB_LOCK_READ_MOD_WRITE)) {
  67.     errno = EINVAL;
  68.     return(-1);
  69.     }
  70.     
  71.     handlePtr->index = 0;
  72.     handlePtr->structSize = size;
  73.     handlePtr->lockType = writing ? LOCK_EX : LOCK_SH;
  74.     handlePtr->lockWhen = lockWhen;
  75.     handlePtr->lockHow = lockHow;
  76.     handlePtr->streamID = streamID;
  77.     handlePtr->firstRec = -1;
  78.     handlePtr->numBuf = numBuf;
  79.     if (numBuf > 0) {
  80.     handlePtr->buffer = malloc((unsigned) numBuf * size);
  81.     } else {
  82.     handlePtr->buffer = (char *) NULL;
  83.     }
  84. #ifndef CLEAN
  85.     handlePtr->fileName = malloc((unsigned) strlen(file) + 1);
  86.     (void) strcpy(handlePtr->fileName, file);
  87. #endif /* CLEAN */
  88.     
  89.  
  90.     if (lockWhen == DB_LOCK_OPEN) {
  91.     return(DbLockDesc(handlePtr));
  92.     }
  93.     return(0);
  94. }
  95.